#include <iostream>
#include <string>

// 定义一个字符串包装类
class MyString {
private:
    std::string data;

public:
    // 默认构造函数
    MyString() : data("") {}

    // 从std::string构造MyString的构造函数
    MyString(const std::string& str) : data(str) {}

    // 重载赋值运算符
    MyString& operator=(const MyString& other) {
        if (this != &other) { // 防止自赋值
            this->data = other.data;
        }
        return *this;
    }

    // 重载加法运算符，实现字符串连接
    MyString operator+(const MyString& other) const {
        return MyString(this->data + other.data);
    }

    // 友元函数，重载流插入运算符，用于输出MyString对象
    friend std::ostream& operator<<(std::ostream& out, const MyString& str) {
        out << str.data;
        return out;
    }
};

// 使用示例
int main() {
    MyString str1("Hello, ");
    MyString str2("World!");

    MyString str3 = str1 + str2; // 使用重载的加法运算符连接字符串
    std::cout << "Concatenated string: " << str3 << std::endl;

    MyString str4;
    str4 = str3; // 使用重载的赋值运算符
    std::cout << "Assigned string: " << str4 << std::endl;

    return 0;
}